
#include "Algebra.h"


Vector SumaVectorial(Vector vA, Vector vB)
{
	Vector vResult;

	vResult.setX(vA.getX() + vB.getX());
	vResult.setY(vA.getY() + vB.getY());
	vResult.setZ(vA.getZ() + vB.getZ());

	return vResult;
}

Vector RestaVectorial(Vector vA, Vector vB)
{
	Vector vResult;

	vResult.setX(vA.getX()-vB.getX());
	vResult.setY(vA.getY()-vB.getY());
	vResult.setZ(vA.getZ()-vB.getZ());


	return vResult;
}

double ProductoPunto(Vector vA, Vector vB)
{
	double dblResult;

	dblResult = (vA.getX()*vB.getX())+(vA.getY()*vB.getY())+(vA.getZ()*vB.getZ());

	return dblResult;
}

Vector ProductoCruz(Vector vA, Vector vB)
{
	Vector vResult;

	vResult.setX((vA.getY()*vB.getZ())-(vB.getY()*vA.getZ()));
	vResult.setY((vA.getX()*vB.getZ())-(vB.getX()*vA.getZ()));
	vResult.setZ((vA.getX()*vB.getY())-(vB.getX()*vA.getY()));

	return vResult;
}

Vector ProductoEscalarVector(double dblEscalar, Vector vA)
{
	Vector vResult;

	vResult.setX(dblEscalar*vA.getX());
	vResult.setY(dblEscalar*vA.getY());
	vResult.setZ(dblEscalar*vA.getZ());

	return vResult;
}

Matriz ProductoMatriz(Matriz M1, Matriz M2)
{
	int f1, f2, c1, c2; 
	double valorTemp;
	VectorAux Temp1;
	VectorAux Temp2;

	f1 = M1.getNroFilas();
	c1 = M1.getNroColumnas();
	f2 = M2.getNroFilas();
	c2 = M2.getNroColumnas();

	Matriz MResult(f1,c2);

	for(int i=0;i<=f1-1;i++)
	{
		for(int j=0;j<=c2-1;j++)
		{
			valorTemp = 0;

			for(int k=0;k<=f2-1;k++)
			{
				valorTemp += M1.getOneVector(i).getOneDato(k)*M2.getOneVector(k).getOneDato(j);
				
				MResult.getOneVector(i).setOneDato(j,valorTemp);
			}
		}
	}
	
	return MResult;
}

VectorAux ProductoMatrizVector(Matriz M, VectorAux v)
{
	VectorAux vResult(4);
	double valorTemp;

	for(int i=0;i<4;i++)
	{
		valorTemp = 0.0;

		for(int j=0;j<4;j++)
		{
			valorTemp += M.getPosition(i,j)*v.getOneDato(j);	
		}

		vResult.setOneDato(i,valorTemp);
	}
	
	return vResult;
}


float CalcularDistancia(Vertice *v1, Vertice v2)
{
	float fDistancia;

	fDistancia =  sqrt(pow(v1->getX()-v2.getX(),2)+pow(v1->getY()-v2.getY(),2)+pow(v1->getZ()-v2.getZ(),2));

	return fDistancia;
}

float CalcularDistancia(Vertice *v1, Vertice *v2)
{
	float fDistancia;

	fDistancia =  sqrt(pow(v1->getX()-v2->getX(),2)+pow(v1->getY()-v2->getY(),2)+pow(v1->getZ()-v2->getZ(),2));

	return fDistancia;
}

float CalcularDistancia(Vertice v1, Vertice v2)
{
	float fDistancia;

	fDistancia =  sqrt(pow(v1.getX()-v2.getX(),2)+pow(v1.getY()-v2.getY(),2)+pow(v1.getZ()-v2.getZ(),2));

	return fDistancia;
}
